package com.hochschild.seguridad.service.implementation;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hochschild.seguridad.dao.ValorOrganizacionalDao;
import com.hochschild.seguridad.domain.ValorOrganizacional;
import com.hochschild.seguridad.local.domain.ValorOrganizacionalSesion;
import com.hochschild.seguridad.service.ValoresOrganizacionalesManager;

/**
 *
 * @author Edson
 */
@Service
public class SimpleValoresOrganizacionalesManager implements ValoresOrganizacionalesManager {

	@Autowired
    private ValorOrganizacionalDao valorOrganizacionalDao;

    public List<ValorOrganizacionalSesion> getValores(String idAplicacion, String idUsuario, String idEstructura) {
        List<ValorOrganizacional> valores = valorOrganizacionalDao.getValoresOrganizacionales(Integer.parseInt(idAplicacion), idUsuario, idEstructura);
        List<ValorOrganizacionalSesion> resultado = cargaListaValorOrganizacionalSesion(valores, idEstructura);
        return resultado;
    }

    protected List<ValorOrganizacionalSesion> cargaListaValorOrganizacionalSesion(List<ValorOrganizacional> valores, String idEstructura) {
        List<ValorOrganizacionalSesion> resultado = new ArrayList<ValorOrganizacionalSesion>();
        ValorOrganizacionalSesion item = null;
        for (ValorOrganizacional valor : valores) {
            item = new ValorOrganizacionalSesion();
            item.setTipoValorOrganizacional(idEstructura);
            item.setValorOrganizacional(valor.getValor());
            resultado.add(item);
        }
        return resultado;
    }

    public List<ValorOrganizacionalSesion> getValoresDescripcion(List<ValorOrganizacionalSesion> valores) {
        
        //trae valores organizacionales
        //hacer el match con la entidad respectiva en la aplicacion

        List<ValorOrganizacionalSesion> listaOrdenada = new ArrayList<ValorOrganizacionalSesion>();
        if (!valores.isEmpty()) {
            listaOrdenada = creaListaValoresOrganizacionalesSesionOrdenada(valores);
        }
        return listaOrdenada;
    }

    protected List<ValorOrganizacionalSesion> creaListaValoresOrganizacionalesSesionOrdenada(List<ValorOrganizacionalSesion> valores) {
        
        List<ValorOrganizacionalSesion> listaOrdenada = new ArrayList<ValorOrganizacionalSesion>();

        String tipoValorOrganizacional = valores.get(0).getTipoValorOrganizacional();
/*
        if (tipoValorIsUnidadMinera(tipoValorOrganizacional)) {

            List<String> idUnidadesMineras = cargaListaId(valores);
            List<UnidadMinera> unidades = unidadMineraDao.getUnidadesMinerasVigentesPorId(idUnidadesMineras);

            if (!unidades.isEmpty()) {
                HashMap<String, ValorOrganizacionalSesion> mapaValores = creaMapaValoresOrganizacionales(valores);
                for (UnidadMinera unidad : unidades) {
                    ValorOrganizacionalSesion item = mapaValores.get(unidad.getIdUnidadMinera());
                    item.setDescripcion(unidad.getAbreviaturaUnidadMinera());
                    listaOrdenada.add(item);
                }
            }
        }
        
  */      
        return listaOrdenada;
    }

    protected List<String> cargaListaId(List<ValorOrganizacionalSesion> valores) {
        List<String> idValores = new ArrayList<String>();
        for (ValorOrganizacionalSesion item : valores) {
            idValores.add(item.getValorOrganizacional());
        }
        return idValores;
    }

  
    
    

    protected HashMap<String, ValorOrganizacionalSesion> creaMapaValoresOrganizacionales(List<ValorOrganizacionalSesion> valores) {
        HashMap<String, ValorOrganizacionalSesion> mapaValores = new HashMap<String, ValorOrganizacionalSesion>();
        for (ValorOrganizacionalSesion valor : valores) {
            mapaValores.put(valor.getValorOrganizacional(), valor);
        }
        return mapaValores;
    }

    

    public ValorOrganizacionalDao getValorOrganizacionalDao() {
        return valorOrganizacionalDao;
    }

    public void setValorOrganizacionalDao(ValorOrganizacionalDao valorOrganizacionalDao) {
        this.valorOrganizacionalDao = valorOrganizacionalDao;
    }

	
	public List<ValorOrganizacionalSesion> getValoresOrganizacionalesByTipo(
			List<ValorOrganizacionalSesion> valoresOrganizacionales, String tipo) {
		
		List<ValorOrganizacionalSesion> valoresUnSoloTipo = new ArrayList<ValorOrganizacionalSesion>();
		
		for(ValorOrganizacionalSesion valor : valoresOrganizacionales){
			if(valor.getTipoValorOrganizacional().equals(tipo)){
				valoresUnSoloTipo.add(valor);
			}	
		}
		
		return valoresUnSoloTipo;
	
	}

	public List<String> getIdsValoresOrganizacionales(List<ValorOrganizacionalSesion> valores) {
		List<String> valoresUnSoloTipo = new ArrayList<String>();
		
		for(ValorOrganizacionalSesion valor : valores){
				valoresUnSoloTipo.add(valor.getValorOrganizacional());
		}
		
		return valoresUnSoloTipo;
	}

   
}
